package com.junxian.demo02.service;

import com.junxian.demo02.dao.User;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

/**
 * @Author: SunJunxian
 * @Date: 2018/12/10
 * @Description: 编写一个继承自JpaRepository的接口就能完成数据访问 ,增加缓存配置注解(@CacheConfig , @Cacheable )
 * @CacheConfig： 主要用于配置该类中会用到的一些共用的缓存配置。
 */

@CacheConfig(cacheNames = "users")
public interface UserService extends JpaRepository<User , Long> {

    /**
     *通过名字来查找数据
     *
     * @param name
     * @return Resule</User>
     * @Cacheable： 配置了findByName函数的返回值将被加入缓存。同时在查询时，会先从缓存中获取，若不存在才再发起对数据库的访问。
     * 通过解析方法名创建查询（所以方法名不能写错）
     */

    @Cacheable
    User findByName(String name);

    /**
     * 通过姓名和年龄来查找数据
     *
     * @param name
     * @param age
     * @return Resule</User>
     */
    User findByNameAndAge(String name , Integer age);

    /**
     *通过姓名来查找数据(User需要写toString方法后控制台才能输出该条数据，不然只是一个包名)
     *
     * @param name
     * @return Resule</User>
     *
     * 除了通过解析方法名来创建查询外，它也提供通过使用@Query 注解来创建查询，您只需要编写JPQL语句，
     * 并通过类似“:name”来映射@Param指定的参数
     */
    @Query("from User u where u.name=:name")
    User findUser(@Param("name") String name);
}
